package model

import (
	"errors"
	"gitee.com/xuxinzhi2206/corehub/database/mysql"
	"gorm.io/gorm"
)

// 积分记录表
type IntegralRecord struct {
	gorm.Model
	IntegralNumber int64  `gorm:"type:int(11);not null;comment:积分变动数量(获得用负数,使用用正数)"`
	Describe       string `gorm:"type:text;not null;comment:积分变动描述"`
	UserId         int64  `gorm:"type:int(11);not null;comment:用户id"`
}

// 创建积分记录
func (ir *IntegralRecord) CreateIntegralRecord() (*IntegralRecord, error) {
	return ir, mysql.WithMysql(func(db *gorm.DB) error {
		return db.Transaction(func(tx *gorm.DB) error {
			//查询积分的详情
			var i Integral
			info, err := i.GetIntegralInfo(ir.UserId)

			//排除为空时的错误
			if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
				return err
			}

			//判断积分不足的情况
			if info.PointsBalance < -ir.IntegralNumber {
				return errors.New("积分不足")
			}

			//查询不到的话创建表
			if errors.Is(err, gorm.ErrRecordNotFound) {
				err = tx.Create(&Integral{
					UserId:        ir.UserId,
					PointsBalance: ir.IntegralNumber,
				}).Error
				if err != nil {
					return err
				}
			} else {
				// 更新积分余额
				err := tx.Model(&Integral{}).Where("user_id = ?", ir.UserId).Update("points_balance", gorm.Expr("points_balance+?", ir.IntegralNumber)).Error
				if err != nil {
					// 更新积分余额时出错
					return err
				}
			}

			// 创建积分记录
			err = tx.Create(ir).Error
			if err != nil {
				// 创建积分记录时出错
				return err
			}

			return nil
		})
	})
}

// 积分记录列表
func (ir *IntegralRecord) GetIntegralRecordList(userId int64) (info []*IntegralRecord, err error) {
	err = mysql.WithMysql(func(db *gorm.DB) error {
		query := db.Model(ir).Where("user_id = ?", userId)

		// 执行查询
		return query.Find(&info).Error
	})
	return
}
